import axios, { AxiosInstance, AxiosResponse, AxiosRequestConfig, AxiosError } from "axios";


export interface Result<T> {
  data: T;
  message: string;
  resCode: number;
}

// 使用指定配置创建axios实例
const service: AxiosInstance = axios.create({
  // 基础路径
  baseURL: "/hook",
  // 请求超时时间
  timeout: 5000,
  headers: { 'Content-Type': 'application/json; charset=utf-8' },
});

// 添加请求拦截器
service.interceptors.request.use(
  (config: AxiosRequestConfig) => {
    if (config && config?.headers) {
      config.headers.token ='asjaisdhjiaYSDIAJISUOAI'
    //   const token = localStorage.getItem("token");
    //   config.headers.Authorization = "Bearer " + token;
    }
    console.log(config, 'config');
    
    // 在发送请求之前做些什么
    return config;
  },
  (error: AxiosError) => {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);

// 添加响应拦截器
service.interceptors.response.use(
  (response: AxiosResponse) => {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    const data = response.data
    if(data.resCode === 0) {
      return data;
    } else {
      // const code = data.resCode
      // 处理业务错误的逻辑
      // if(code === 1111) {

      // }
      // if(code === 1111) {
        
      // }
      // 这里是业务失败，不是http状态失败
      return Promise.reject(data);
    }
    console.log(response, 'response');
  },
  (error: AxiosError) => {
    // const status = error.response?.status
    // switch(status) {
    //   case 400: 
    //     break;
    //   case 401:
    //     break;
    //   default:
        
    // }
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    // console.log(error.response, 'response');
    
    return Promise.reject(error);
  }
);

// AxiosInstance 和 AxiosRequestConfig 警告报错
// 第一种：改成any
// 第二种：降低版本：npm install axios@1.2.4 -S

export const http = {
  get<T = any>(url: string, config?: AxiosRequestConfig): Promise<Result<T>> {
    return service.get(url, config);
  },
  post<T = any>(
    url: string,
    data?: object,
    config?: AxiosRequestConfig
  ): Promise<Result<T>> {
    console.log(url, 'url');
    
    return service.post(url, data, config);
  },
};

export default service;
